//
// Created by 下次一定 on 2021/9/13.
//  连通块中点的数量
/*有3个操作
 *  c 1.两个点连一个边
 *  1 2.询问两个点是否在同一个连通块中
 * 3.询问连通块点的数量
 * */


#include <iostream>
using namespace std;

const int N = 100010;
int p[N] , size[N];

int m,n;

int find(int x){//返回x的祖宗节点  同时对路径压缩
    if(p[x]!=x)  p[x]= find(p[x]);
    //while(p[x]!=x)x=p[x];  这个不会对路径压缩
    return p[x];
}


int main(){
    cin >> n >> m;
    for (int i = 0 ;i<n;i++){
        p[i]=i;
        size[i] = 1;
    }

    while(m--){
        char op[2];
        int a , b;

        if(op[0]=='C'){//a的祖宗节点的父亲=b的祖宗节点
            cin >>op>>a>>b;
            if(find(a)!=find(b)){
                size[find(b)] += size[find(a)];
                p[find(a)]=p[find(b)];
            }
        }
        else if(op[0]=='1'){
            cin >>op>>a>>b;
            if(find(a)==find(b)) puts("yes");
            else puts("no");
        }else{
            cin>>a;
            cout<< size[find(a)];
        }

    }
}